package com.bitsemart;
import android.test.ActivityInstrumentationTestCase2;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

/**
 * Created by Marcos on 13/05/2015.
 */
public class AndroidTest extends ActivityInstrumentationTestCase2<MainActivity> {
    Videojuego videojuego = new Videojuego("GTA V", 2015, 49, "Sandbox", "Rockstar", "th Yankton y" +
            " ha sido puesto bajo proteccion de testigos con su familia en Los Santos San Andreas" +
            " con una nueva identidad Michael punto de con...", null);
    private MainActivity myMainActivity;
    private BDHendrix myBDHendrix;

    public AndroidTest() {
        super(MainActivity.class);

    }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        myMainActivity = getActivity();
        myBDHendrix = myMainActivity.getBDHendrix();
    }

    @Override
    public void tearDown() throws Exception {
        //deleteAllGames();
    }

    private void deleteAllGames() {
        ArrayList<Videojuego> allGames = null;
        try {
            allGames = myBDHendrix.obtenerTodosLosJuegos();
            int id;
            for (Videojuego v : allGames) {
                id = v.getId();
                myBDHendrix.eliminarJuego(id);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
    /**
     * Crea e inserta un juego y comprueba que hay un juego mas
     */
    public void testInsertGame() {

        ArrayList<Videojuego> al = new ArrayList<Videojuego>();
        int first;
        int second;
        try {
            al = myBDHendrix.obtenerTodosLosJuegos();

            if (al == null) {
                first = 0;
            } else {
                first = al.size();

            }
            myBDHendrix.insertarJuego(videojuego.getTitulo(),videojuego.getYear(),
                    videojuego.getPrecio(),videojuego.getGenero(), videojuego.getDesarrollador(),
                    videojuego.getDescripcion(),null);

            al = myBDHendrix.obtenerTodosLosJuegos();
            second = al.size();
            assertEquals(first + 1, second);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    /**
     * Crea e inserta un juego, para posteriormente eliminarlo y comprobar que hay un juego menos
     */
    public void testDeleteGame() {
        Videojuego vj = new Videojuego("Crash Bandicoot", 1999, 10, "Plataformas", "Naugty Dog",
                "Juego de plataformas para toda la familia", null);
        try {
            myBDHendrix.insertarJuego(vj.getTitulo(),vj.getYear(),
                    vj.getPrecio(),vj.getGenero(), vj.getDesarrollador(),
                    vj.getDescripcion(),null);
            ArrayList<Videojuego> allGames = myBDHendrix.obtenerTodosLosJuegos();
            int first, second;
            if (allGames == null) {
                first = 0;
            } else {
                first = allGames.size();
            }
            int index = 0;
            boolean encontrado = false;
            while (allGames.size() > index && !encontrado) {
                if (allGames.get(index).getTitulo().equals("Crash Bandicoot")) {
                    encontrado = true;
                } else {
                    index++;
                }
            }
            int id = allGames.get(index).getId();
            myBDHendrix.eliminarJuego(id);
            allGames = myBDHendrix.obtenerTodosLosJuegos();
            if (allGames == null) {
                second = 0;
            } else {
                second = allGames.size();

            }
            assertEquals(first - 1, second);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    /**
     * Crea e inserta 1000 juegos y comprueba que hay 1000 juegos mas
     */
    public void testInsert1000Games() {
        int NUM_GAMES_TO_INSERT = 1000;
        ArrayList<Videojuego> al = new ArrayList<Videojuego>();
        int first;
        int second;
        try {
            al = myBDHendrix.obtenerTodosLosJuegos();

            if (al == null) {
                first = 0;
            } else {
                first = al.size();

            }
            int i = 0;
            Videojuego videojAux;
            String sAux;
            while (i < NUM_GAMES_TO_INSERT) {
                sAux = "Assasins Creed " + i;
                videojAux = new Videojuego(sAux, 2015, 60, "Saltar pa la paja", "Robisoft", "Robo de juego", null);
                myBDHendrix.insertarJuego(videojAux.getTitulo(),videojAux.getYear(),
                        videojAux.getPrecio(),videojAux.getGenero(), videojAux.getDesarrollador(),
                        videojAux.getDescripcion(),null);
            }
            al = myBDHendrix.obtenerTodosLosJuegos();
            second = al.size();
            assertEquals(first + NUM_GAMES_TO_INSERT, second);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    /**
     * Obtiene un juego co id valido
     */
    public void testGetGameOk() {
        try {
            ArrayList<Videojuego> allGames = myBDHendrix.obtenerTodosLosJuegos();
            Videojuego juego1 = allGames.get(0);
            int id = juego1.getId();
            Videojuego juego2 = myBDHendrix.obtenerJuego(id);
            assertEquals(juego1.getTitulo(), juego1.getTitulo());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }

    /**
     * Obtiene un juego con id invalido
     */
    public void testGetGameWrong() {
        Videojuego v1 = null;
        try {
            v1 = myBDHendrix.obtenerJuego(-1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        assertEquals(null, v1);
    }

    /**
     * Pide a la base de datos todos los juegos
     */
    public void testGetAllGames() {
        try {
            myBDHendrix.obtenerTodosLosJuegos();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        assertTrue(true);
    }

    public void testOfAll() {
        try {
            myBDHendrix.insertarJuego(videojuego.getTitulo(),videojuego.getYear(),
                    videojuego.getPrecio(),videojuego.getGenero(), videojuego.getDesarrollador(),
                    videojuego.getDescripcion(),null);
            myBDHendrix.insertarJuego(videojuego.getTitulo(),videojuego.getYear(),
                    videojuego.getPrecio(),videojuego.getGenero(), videojuego.getDesarrollador(),
                    videojuego.getDescripcion(),null);
            ArrayList<Videojuego> allGames = myBDHendrix.obtenerTodosLosJuegos();
            for (Videojuego v : allGames) {
                myBDHendrix.obtenerJuego(v.getId());
                myBDHendrix.eliminarJuego(v.getId());
            }
            allGames = myBDHendrix.obtenerTodosLosJuegos();
            int size;
            if (allGames == null) {
                size = 0;
            } else {
                size = allGames.size();
            }
            assertEquals(0, size);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
    public void testGetGame() throws ExecutionException, InterruptedException {
        ArrayList<Videojuego> alv = myBDHendrix.obtenerTodosLosJuegos();
        String s = alv.get(0).getImagen().toString();
        System.out.println(s);
    }

}
